package com.baizw.cultivation.util;

import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baizw.cultivation.common.properties.CultivationProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

/**
 * 文件工具类
 *
 * @author 剧终1204
 * @version V1.0
 * @date 2020年06月16日 11:14
 */
@Slf4j
public class FileUtil extends cn.hutool.core.io.FileUtil {

    private static CultivationProperties properties;

    public static CultivationProperties getProperties() {
        return SpringUtil.getBean(CultivationProperties.class);
    }

    /**
     * 上传文件到指定目录，支持重命名
     *
     * @param multipartFile 上传文件流
     * @param target        目标地址
     * @param fileName      重命名名称
     * @return 保存成功后的完整路径
     */
    public static String upload(MultipartFile multipartFile, String target, String fileName) {
        if (multipartFile.isEmpty()) {
            log.error("文件大小为空");
            return StrUtil.EMPTY;
        }
        if (StrUtil.isBlank(target)) {
            log.error("上传目标路径为空，系统已使用默认路径: {}", properties.getUpload().getPath());
        }
        if (StrUtil.isBlank(fileName)) {
            String originalFilename = multipartFile.getOriginalFilename();
            fileName = StringUtils.substringBefore(originalFilename, StrUtil.DOT);
            log.error("用户未提供重命名，系统已使用默认文件名称: {}", fileName);
        }
        try {
            File file = FileUtil.file(target);
            if (file.exists()) {
                file.mkdirs();
            }
            String type = FileTypeUtil.getType(multipartFile.getInputStream());
            StringBuilder realPath = new StringBuilder();
            realPath.append(target).append(File.separator)
                    .append(fileName).append(StrUtil.DOT).append(type);

            multipartFile.transferTo(file);
            return realPath.toString();
        } catch (Exception ex) {
            return StrUtil.EMPTY;
        }
    }

}
